home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 22 / Amiga Format AFCD22 (Jan 1998, Issue 106).iso / -in_the_mag- / emulation / c64-tape / turbohd2.asm < prev   
Assembly Source File  |  1997-11-17  |  5KB  |  330 lines

  1. *************************************************************************
  2. * TurboTape Loader
  3. * (C) 1995,1997 Per Håkan Sundell
  4. * requires CCS adapter
  5. *************************************************************************
  6.  
  7. *        incdir     Devpac:include
  8.  
  9. *=======================================================================*
  10. *                                    *
  11. *    CODE SECTION                            *
  12. *                                    *
  13. *=======================================================================*
  14.         section    CODE,code
  15.  
  16.     
  17. Main
  18.     LEA    file_name,A1
  19.     BSR    ParseArgs
  20.     BSR    OpenLibraries
  21.     BSR    PressPlay
  22.     TST.L    D0
  23.     BNE    _mbreak
  24.     BSR    ReadHeader
  25.     BSR    FoundFile
  26.     TST.L    D0
  27.     BNE    _mbreak
  28.     BSR    PressPlay
  29.     TST.L    D0
  30.     BNE    _mbreak
  31.     LEA    TXT_LOADING,A0
  32.     BSR    Print
  33.     BSR    ReadFileData
  34.     TST.L    D0
  35.     BNE    _merror
  36.     BSR    SaveFile
  37.     TST.L    D0
  38.     BNE    _mserror
  39.     RTS
  40.  
  41. _merror    LEA    TXT_LOADERROR,A0
  42.     BSR    Print
  43.     RTS
  44.  
  45. _mbreak    LEA    TXT_BREAK,A0
  46.     BSR    Print
  47.     RTS
  48.  
  49. _mserror    LEA    TXT_SAVEERROR,A0
  50.     BSR    Print
  51.     RTS
  52.  
  53. IrqOff
  54.     MOVE.W    #$4000,$DFF09A
  55.     RTS
  56.  
  57. IrqOn
  58.     MOVE.W    #$C000,$DFF09A
  59.     RTS
  60.  
  61. ParseArgs
  62.     MOVEM.L    D1/D2/A1,-(SP)
  63.     MOVEQ    #$20,D2
  64. _pa1    SUBQ.L    #1,D0
  65.     BMI    _pa3
  66.     MOVE.B    (A0)+,D1
  67.     CMP.B    #$20,D1
  68.     BEQ    _pa1
  69.     CMP.B    #10,D1
  70.     BEQ    _pa3
  71.     CMP.B    #$22,D1
  72.     BNE    _pa2
  73.     MOVE.B    D1,D2
  74.     SUBQ.L    #1,D0
  75.     BMI    _pa3
  76.     MOVE.B    (A0)+,D1
  77. _pa2    MOVE.B    D1,(A1)+
  78.     SUBQ.L    #1,D0
  79.     BMI    _pa3
  80.     MOVE.B    (A0)+,D1
  81.     CMP.B    #10,D1
  82.     BEQ    _pa3
  83.     CMP.B    D2,D1
  84.     BNE    _pa2
  85. _pa3    CLR.B    (A1)
  86.     MOVEM.L    (SP)+,D1/D2/A1
  87.     RTS
  88.  
  89. SaveFile
  90.     LEA    file_header+5,A0
  91.     MOVE.L    A0,D1
  92.     MOVE.L    #$3EE,D2
  93.     MOVE.L    dos_lib,A6
  94.     JSR    -$1E(A6)
  95.     MOVE.L    D0,D1
  96.     BEQ    _sferror
  97.     CMP.L    #$FFFFFFFF,D0
  98.     BEQ    _sferror
  99.     MOVE.L    D1,-(SP)
  100.     LEA    file_header,A0
  101.     MOVE.L    A0,D2
  102.     MOVEQ    #2,D3
  103.     MOVE.L    dos_lib,A6
  104.     JSR    -$30(A6)
  105.     MOVE.L    (SP),D1
  106.     LEA    file_data,A0
  107.     MOVE.L    A0,D2
  108.     MOVE.L    file_length,D3
  109.     MOVE.L    dos_lib,A6
  110.     JSR    -$30(A6)
  111.     MOVE.L    (SP)+,D1
  112.     MOVE.L    dos_lib,A6
  113.     JSR    -$24(A6)
  114.     MOVEQ    #0,D0
  115.     RTS
  116.  
  117. _sferror    MOVEQ    #1,D0
  118.     RTS
  119.  
  120. ReadFileData
  121.     BSR    MotorOn
  122.     LEA    file_data,A0
  123.     MOVE.L    A0,A1
  124.     MOVEQ    #0,D0
  125.     MOVEQ    #0,D1
  126.     MOVE.B    file_header+1,D0
  127.     MOVE.B    file_header+3,D1
  128.     LSL.W    #8,D0
  129.     LSL.W    #8,D1
  130.     MOVE.B    file_header,D0
  131.     MOVE.B  file_header+2,D1
  132.     SUB.W    D0,D1
  133.     ADD.L    D1,A1
  134.     MOVE.L    D1,file_length
  135.     BSR    ReadSync
  136.     MOVEQ    #0,D3
  137. _rfd1    BSR    ReadByte
  138.     MOVE.B    D0,(A0)+
  139.     EOR.B    D0,D3
  140.     CMP.L    A0,A1
  141.     BNE    _rfd1
  142.     BSR    ReadByte
  143.     EOR.B    D3,D0
  144.     MOVE.L    D0,-(SP)
  145.     BSR    MotorOff
  146.     MOVE.L    (SP)+,D0
  147.     AND.L    #$FF,D0
  148.     RTS
  149.  
  150. ReadHeader
  151.     BSR    MotorOn
  152.     BSR    ReadSync
  153.     CMP.B    #0,D0
  154.     BEQ    ReadHeader
  155.     LEA    file_header,A0
  156.     MOVEQ    #0,D3
  157. _rh1    BSR    ReadByte
  158.     MOVE.B    D0,0(A0,D3.W)
  159.     ADDQ.W    #1,D3
  160.     CMP.B    #$C0,D3
  161.     BNE    _rh1
  162.     BSR    MotorOff
  163.     RTS
  164.  
  165. ReadSync
  166.     MOVE.W    #$7F80,D7
  167.     MOVE.W    #$40,$DFF0A8
  168.     MOVE.W    #$80,$DFF09C
  169.     MOVE.W    #$80,$DFF0A6
  170. _rs1    BTST    #6,$BFE001
  171.     BEQ    _rs4
  172.     BSR    ReadBit
  173.     ROXL.B    #1,D2
  174.     CMP.B    #2,D2
  175.     BNE    _rs1
  176.     MOVEQ    #9,D3
  177. _rs2    BSR    ReadByte
  178.     CMP.B    #2,D0
  179.     BEQ    _rs2
  180. _rs3    CMP.B    D3,D0
  181.     BNE    _rs1
  182.     BSR    ReadByte
  183.     SUBQ.B    #1,D3
  184.     BNE    _rs3
  185. _rs4    RTS
  186.  
  187. ReadByte
  188.     MOVEQ    #7,D1
  189. _rby1    BSR    ReadBit
  190.     ROXL.B    #1,D2
  191.     DBRA    D1,_rby1
  192.  
  193.     MOVE.B    D2,D0
  194.     RTS
  195.  
  196. ReadBit
  197.     MOVEQ    #0,D0
  198. _rb1    OR.B    $BFDD00,D0
  199.     BTST    #4,D0
  200.     BEQ    _rb1
  201.     MOVE.W    #$80,$DFF09C
  202.     MOVE.W    D7,$DFF0AA
  203.     MOVE.W    $DFF006,$DFF180
  204.     MOVE.B    #$19,$BFDF00
  205.     NOT.B    D0
  206.     AND.B    #2,D0
  207.     SUBQ.B    #2,D0
  208.     RTS
  209.  
  210. PressPlay
  211.     BCLR    #5,$BFD100
  212.     MOVE.B    $BFE001,D0
  213.     BSET    #5,$BFD100
  214.     BTST    #5,D0
  215.     BEQ    _pp2
  216.     LEA    TXT_PLAY,A0
  217.     BSR    Print
  218. _pp1    BTST    #6,$BFE001
  219.     BEQ    _pp3
  220.     BCLR    #5,$BFD100
  221.     MOVE.B    $BFE001,D0
  222.     BSET    #5,$BFD100
  223.     BTST    #5,D0
  224.     BNE    _pp1
  225. _pp2    MOVEQ    #0,D0
  226.     RTS
  227.  
  228. _pp3    MOVEQ    #1,D0
  229.     RTS
  230.  
  231. MotorOn
  232.     BSR    IrqOff
  233.     BCLR    #7,$BFD100
  234.     BCLR    #5,$BFD100
  235.     MOVE.B    #0,$BFD700
  236.     MOVE.B    #$BE,$BFD600
  237.     MOVEQ    #0,D0
  238. _mo1    DBRA    D0,_mo1
  239.  
  240.     RTS
  241.  
  242. MotorOff
  243.     BSET    #7,$BFD100
  244.     BSET    #5,$BFD100
  245.     BCLR    #5,$BFD100
  246.     BSET    #5,$BFD100
  247.     BSR    IrqOn
  248.     RTS
  249.  
  250. OpenLibraries
  251.     LEA    doslibrary.MSG,A1
  252.     MOVEQ    #0,D0
  253.     MOVE.L    4,A6
  254.     JSR    -$198(A6)
  255.     MOVE.L    D0,dos_lib
  256.     MOVE.L    dos_lib,A6
  257.     JSR    -$3C(A6)
  258.     MOVE.L    D0,std_out
  259.     RTS
  260.  
  261. FoundFile
  262.     LEA    TXT_FOUND,A0
  263.     BSR    Print
  264.     LEA    file_header+5,A0
  265.     LEA    $10(A0),A1
  266. _ff1    MOVE.B    -(A1),D0
  267.     CMP.B    #$20,D0
  268.     BNE    _ff2
  269.     CMP.L    A0,A1
  270.     BNE    _ff1
  271. _ff2    CLR.B    1(A1)
  272.     BSR    Print
  273.     LEA    TXT_LINEFEED,A0
  274.     BSR    Print
  275.     MOVE.L    #$200000,D0
  276. _ff3    BTST    #6,$BFE001
  277.     BEQ    _ff4
  278.     SUBQ.L    #1,D0
  279.     BNE    _ff3
  280.     MOVEQ    #0,D0
  281.     RTS
  282.  
  283. _ff4    MOVEQ    #1,D0
  284.     RTS
  285.  
  286. Print
  287.     MOVEM.L    D2/D3/A6,-(SP)
  288.     MOVE.L    A0,D2
  289.     MOVEQ    #0,D3
  290. _p1    TST.B    (A0)+
  291.     BEQ    _p2
  292.     ADDQ.L    #1,D3
  293.     BRA    _p1
  294.  
  295. _p2    TST.L    D3
  296.     BEQ    _p3
  297.     MOVE.L    std_out,D1
  298.     MOVE.L    dos_lib,A6
  299.     JSR    -$30(A6)
  300. _p3    MOVEM.L    (SP)+,D2/D3/A6
  301.     RTS
  302.  
  303. *=======================================================================*
  304. *                                    *
  305. *    DATA SECTION                            *
  306. *                                    *
  307. *=======================================================================*
  308.     Section    DATA,data
  309.  
  310.  
  311. TXT_PLAY    dc.b    10,'PRESS PLAY ON TAPE',$A,0
  312. TXT_FOUND    dc.b    'FOUND ',0
  313. TXT_LOADING    dc.b    'LOADING',$A,0
  314. TXT_BREAK    dc.b    'BREAK ERROR',$A,0
  315. TXT_LOADERROR    dc.b    'LOAD ERROR',$A,0
  316. TXT_SAVEERROR    dc.b    'UNABLE TO CREATE AMIGA FILE ERROR',$A,0
  317. TXT_LINEFEED    dc.b    10,0
  318. doslibrary.MSG    dc.b    'dos.library',0,0
  319.  
  320.     Section    Bss,BSS
  321.  
  322. dos_lib        ds.l    1
  323. std_out        ds.l    1
  324. file_name       ds.b    80
  325. file_header     ds.b    $100
  326. file_length    ds.l    1
  327. file_data    ds.b    $10000
  328.  
  329.     END
  330.